package savet.repositorio;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import savet.entidades.Ementa;
import savet.repositorio.exceptions.NonexistentEntityException;
import savet.repositorio.exceptions.PreexistingEntityException;
import savet.util.io.ArquivoUtil;
import savet.util.SauditaLog;

/**
 *
 * @author Adisson Marinho
 */
public class RepositorioEmenta implements IRepositorioEmenta {

    private static File arquivoEmentario;
    private static List<Ementa> ementas = new LinkedList<Ementa>();

    static {
        try {
            arquivoEmentario = new File("resource/ementario.saud");
            if (arquivoEmentario != null && arquivoEmentario.exists()) {
                ementas = (List<Ementa>) ArquivoUtil.getInstance().abrirArquivo(arquivoEmentario);
            }
        } catch (IOException ex) {
            SauditaLog.adicionarSevereLog(null, ex);
        } catch (ClassNotFoundException ex) {
            SauditaLog.adicionarSevereLog(null, ex);
        }
    }
    public void create(Ementa ementa) throws PreexistingEntityException, Exception {
        ementas.add(ementa);
        salvarArquivo();
    }

    public void destroy(String id) throws NonexistentEntityException {
        Ementa e = new Ementa(id);
        if (ementas.remove(e)) {
            salvarArquivo();
        }
    }

    public void edit(Ementa ementa) throws NonexistentEntityException, Exception {
        if (ementas.contains(ementa)) {
            ementas.set(ementas.indexOf(ementa), ementa);
            salvarArquivo();
        }
    }

    public Ementa findEmenta(String id) {
        for (Ementa ementa : ementas) {
            if (ementa.getEmenta().equals(id)) {
                return ementa;
            }
        }
        return null;
    }

    public List<Ementa> findEmentaEntities() {
        return ementas;
    }

    public List<Ementa> findEmentaEntities(int maxResults, int firstResult) {
        return ementas.subList(0, maxResults);
    }

    public int getEmentaCount() {
        return ementas.size();
    }

    public LinkedList<String> getGrupos() {
        LinkedList<String> grupos = new LinkedList<String>();
        for (Ementa ementa : ementas) {
            if (!grupos.contains(ementa.getGrupo())) {
                grupos.add(ementa.getGrupo());
            }
        }
        return grupos;
    }

    public List getPorPropiedade(String nomePropiedade, Object valorPropiedade) {
        LinkedList<Ementa> result = new LinkedList<Ementa>();
        for (Ementa ementa : ementas) {
            if (ementa.getTipo().equals(valorPropiedade)) {
                result.add(ementa);
            }
        }
        return result;
    }

    private void salvarArquivo() {
        try {
            ArquivoUtil.salvarComFileChooser((Serializable) ementas);
        } catch (IOException ex) {
            SauditaLog.adicionarSevereLog(null, ex);
        }
    }
}
